同步和扫描数据库

Metabase 运行不同类型的查询,以保持数据库最新。

  • 同步会获取更新的模式,以在 数据浏览器 中显示。
  • 扫描会采集列值的样本,以填充筛选器下拉菜单并建议有用的可视化。Metabase 不会存储数据库中的完整表。
  • 指纹识别会采集额外的列值样本,以帮助实现智能行为,例如条形图的自动分箱。

初始同步、扫描和指纹识别

当 Metabase 首次连接到您的数据库时,Metabase 会执行 同步 以确定表中列的元数据,并自动为每列分配一个 语义类型。同步成功后,Metabase 会运行每张表的 扫描,以查找 URL、JSON、编码字符串等。指纹识别 查询在同步完成后运行。

您可以从 管理 > 故障排除 > 日志 中跟踪这些查询的进度。

查询运行完成后,您可以从 管理设置 > 表元数据 中查看和编辑同步的元数据。有关更多信息,请参阅 编辑元数据

选择 Metabase 同步和扫描的时间

如果您想更改 同步扫描 查询的默认计划

  1. 转到 管理 > 数据库 > 您的数据库。
  2. 展开 显示高级选项
  3. 开启 选择何时进行同步和扫描

安排数据库同步

如果您已开启 选择何时进行同步和扫描,您将能够设置

  • 同步 的频率:每小时(默认)或每天。
  • 运行同步的时间,以 Metabase 应用程序运行所在的服务器的时区为准。

安排数据库扫描

如果您已开启 选择何时进行同步和扫描,您将看到以下 扫描 选项

  • 定期,按计划 允许您以与数据库更改速率相匹配的频率运行 扫描查询。时间以 Metabase 应用程序运行所在的服务器的时区为准。对于小型数据库或具有经常更新的不同值的表,这是最佳选择。
  • 仅在添加新的筛选器小组件时 如果您希望 扫描查询 按需运行,这是一个很好的选择。开启此选项意味着,当向仪表盘或 SQL 问题添加新的筛选器时,Metabase 将仅扫描和缓存使用的字段的值。
  • 从不,如果需要,我会手动执行 对于数据库非常大或从不真正添加新值的情况,这是一个选项。使用 立即重新扫描字段值 按钮运行手动扫描,并使您的筛选器值保持最新。

手动同步表和列

  1. 转到 管理设置 > 数据库 > 您的数据库。
  2. 点击 立即同步数据库模式

手动扫描列值

要扫描表中所有列的值

  1. 转到 管理设置 > 表元数据 > 您的数据库。
  2. 选择您想要更新到数据库的表。
  3. 点击页面顶部的 齿轮 图标
  4. 点击 重新扫描此表

要扫描特定列的值

  1. 转到 管理设置 > 表元数据 > 您的数据库。
  2. 选择表。
  3. 找到您想要更新到数据库的列。
  4. 点击该列面板中的 齿轮 图标
  5. 点击 重新扫描此字段

清除表或字段的缓存值

要清除 表的扫描字段值

  1. 转到 管理设置 > 表元数据
  2. 选择数据库和表。
  3. 点击右上角的 齿轮 图标
  4. 点击 丢弃缓存的字段值

您还可以通过点击字段上的 齿轮 图标并点击 丢弃缓存的字段值,来告知 Metabase 忘记单个字段的缓存值。

禁用特定表的同步和扫描

要阻止 Metabase 对特定表运行同步和扫描,请将 表可见性 更改为 隐藏

  1. 转到 管理设置 > 表元数据 > 您的数据库。
  2. 将鼠标悬停在侧边栏中的表名上。
  3. 点击 眼镜 图标。

隐藏表还将阻止其显示在 查询构建器数据参考 中。人们仍然可以从 SQL 编辑器 中查询隐藏的表。

使用 API 进行同步和扫描

Metabase 定期进行同步和扫描,但如果数据库管理员刚刚更改了数据库模式,或者在特定时间自动添加了大量数据,您可能需要编写一个脚本,使用 Metabase API 强制进行同步或扫描。 我们的 API 提供了两种启动数据库同步或扫描的方法

  1. 使用会话令牌:/api/database/:id/sync_schemaapi/database/:id/rescan_values 端点。这些端点执行与在管理面板中转到数据库并分别选择 立即同步数据库模式立即重新扫描字段值 相同的操作。要使用这些端点,您必须使用用户 ID 进行身份验证,并在请求标头中传递会话令牌。
  2. 使用 API 密钥:/api/notify/db/:id。我们创建此端点是为了让人们在 ETL 操作 完成后通知他们的 Metabase 进行同步。要使用此端点,您必须通过定义 MB_API_KEY 环境变量来传递 API 密钥。

数据库同步的工作原理

Metabase 同步 是一个查询,它从您的数据库中获取更新的表和视图名称、列名和列数据类型的列表

SELECT
    TRUE
FROM
    "your_schema"."your_table_or_view"
WHERE
    1 <> 1
LIMIT 0

此查询在设置期间针对您的数据库运行,默认情况下每小时再次运行。对于大多数关系数据库,此扫描查询速度很快,但对于 MongoDB 和一些 社区构建的数据库驱动程序 可能会较慢。同步无法完全关闭,否则 Metabase 将无法工作。

数据库扫描的工作原理

Metabase 扫描 是一个查询,它通过查看每张表的前 1,000 条不同记录(按升序排列)来缓存筛选器下拉菜单的列值

SELECT
    "your_table_or_view"."column" AS "column"
FROM
    "your_schema"."your_table_or_view"
GROUP BY
    "your_table_or_view"."column"
ORDER BY
    "your_table_or_view"."column" ASC
LIMIT 1000

对于每条记录,Metabase 仅存储前 100 KB 的文本,因此如果您的数据每条记录有 1,000 个字符(例如地址),并且您的列有超过 100 个唯一地址,Metabase 将仅缓存扫描查询中的前 100 个值。

缓存的列值显示在筛选器下拉菜单中。如果人们在筛选器搜索框中键入的值不在前 1,000 条不同记录或 100KB 文本中,Metabase 将针对您的数据库运行查询,以动态查找这些值。

扫描比同步查询更密集,因此它仅在设置期间运行一次,默认情况下每天再次运行一次。如果您完全 禁用扫描,则需要通过运行 手动扫描 来更新内容。

为了减少 Metabase 需要扫描的表和字段的数量,以便与您连接的数据库保持同步,Metabase 将仅扫描最近十四天内有人查询过的字段的值。

定期重新指纹识别表

定期重新指纹识别将增加数据库的负载。

默认情况下,Metabase 仅在您首次连接数据库时运行 指纹识别 查询。

如果您希望 Metabase 在 UI 中提供建议时使用更大的列值样本,请开启此设置

  1. 转到 管理 > 数据库 > 您的数据库。
  2. 展开 显示高级选项
  3. 开启定期重新指纹识别表

数据库指纹识别的工作原理

指纹识别查询会查看数据库中给定表或视图的前 10,000 行

SELECT
    *
FROM
    "your_schema"."your_table_or_view"
LIMIT 10000

此查询的结果用于在 Metabase UI 中提供更好的建议(例如,过滤器下拉列表和自动分箱)。为避免给数据库带来压力,Metabase 仅在您首次设置数据库连接时运行指纹识别查询。首次。要更改此默认设置,您可以开启定期重新指纹识别表

延伸阅读

Metabase 在同步和扫描过程中不进行任何缓存或速率限制。如果您的数据似乎丢失或过期,请查看

阅读其他Metabase 版本的文档。